/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package newpeer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import net.jxta.socket.JxtaSocket;

/**
 *
 * @author Manuel
 */
public class ThreadRecuperarDescarga extends Thread {

    private String nameArchivo; //El nombre del archivo que este en marcha en ese momento
    private int ipaquete;  // Paquete en el cual se encuentra el archivo a descargar
    private int totalPaquetes;  // Número total de paquetes para calcular el estado de la descarga
    private Peer padre;
    private String idPipe;
    private String tamanoArchivo;
    private String mensajeNew;
    private String NamePeer;
    private Prog barra;
    private int paqueteRecuperar;
    private String nombreArNuevo;
    private File archivoEstado;

    public String getIdPipe() {
        return idPipe;
    }

    public int getIpaquete() {
        return ipaquete;
    }

    public String getMensajeNew() {
        return mensajeNew;
    }

    public String getNameArchivo() {
        return nameArchivo;
    }

    public String getTamanoArchivo() {
        return tamanoArchivo;
    }

    public int getTotalPaquetes() {
        return totalPaquetes;
    }

    public ThreadRecuperarDescarga(String nombreArchivo,String nombreArNuevo,File archivoEstado ,int paqueteRecuperar, String tamanoArchivo, String idPipe, Peer padre, String NamePeer) {
        this.paqueteRecuperar = paqueteRecuperar;
        this.archivoEstado=archivoEstado;
        this.nombreArNuevo=nombreArNuevo;
        this.nameArchivo = nombreArchivo;
        this.tamanoArchivo = tamanoArchivo;
        this.idPipe = idPipe;
        this.padre = padre;
        this.NamePeer = NamePeer;
        totalPaquetes = 0;
    }

    @Override
    public void run() {
        //  String mensaje = "DESCARGAR_ARCHIVO" + SEPARADOR_MENSAJE + nombreArchivo;
        ipaquete = 0;
        //nameArchivo = nombreArchivo;
        try {
            JxtaSocket socketServidor = padre.conectarse(idPipe);
            OutputStream clienteOut = socketServidor.getOutputStream();
            InputStream clienteIn = socketServidor.getInputStream();
            PrintWriter pw = new PrintWriter(clienteOut, true);
            pw.println("RECUPERAR_DESCARGA_ARCHIVO;" + nameArchivo + ";" + paqueteRecuperar);
            long tamArchivo = Long.parseLong(tamanoArchivo);
            byte[] mens = new byte[(int) Peer.TAM_PAQUETES];
            try {
                File nuevoArchivo = new File(padre.RUTA_ARCHIVOS_COMPARTIDOS_DESCARGADOS + nombreArNuevo);
                FileOutputStream fos = new FileOutputStream(nuevoArchivo, true);
                long tamPaquetes = Peer.TAM_PAQUETES;
                long numeroPaquetes = tamArchivo / tamPaquetes;
                totalPaquetes = (int) numeroPaquetes;
                barra = new Prog(padre, totalPaquetes, nameArchivo,nuevoArchivo.getName(),new File(""));
                barra.setValueProgreso(ipaquete+1);
                long modulo = tamArchivo % tamPaquetes;
                if (tamArchivo < tamPaquetes) {
                    byte[] menor = new byte[(int) tamArchivo];
                    clienteIn.read(menor);
                    fos.write(menor);
                } else {
                    int j = 0;
                    for (int i = paqueteRecuperar+1; i < numeroPaquetes; i++) {
                        ipaquete = i;
                        byte[] paq = new byte[(int) tamPaquetes];
                        clienteIn.read(paq);
                        fos.write(paq);
                        System.out.println("PAQUETE " + i);
                        if ((ipaquete == numeroPaquetes - 1) && (modulo == 0)) {
                            mensajeNew = "ESTADO: ARCHIVO DESCARGADO";
                        }
                        barra.iterar(j++);

                    }
                    long loQueFalta = tamArchivo - (numeroPaquetes * tamPaquetes);
                    if (loQueFalta > 0) {
                        byte[] paq = new byte[(int) loQueFalta];
                        clienteIn.read(paq);
                        fos.write(paq);
                        mensajeNew = "ESTADO: ARCHIVO DESCARGADO";
                        j = j + 1;
                        barra.iterar(j);

                    }
                }

                fos.close();
                padre.desconectarse(socketServidor);
                archivoEstado.delete();
                JOptionPane.showMessageDialog(padre, "El archivo '" + nameArchivo + "' ha sido RECUPERADO exitosamente", "Carga Archivo", JOptionPane.INFORMATION_MESSAGE);
                padre.getPanelArchivos().abrirArchivo(nuevoArchivo.getAbsolutePath());
                //Actualizar Interfaz Gráfica
                padre.getPanelArchivos().actualizarArchivos();
                //republicar los archivos
                padre.repaint();
                padre.pack();
                padre.compartirArchivoEnRed(nuevoArchivo);

            } catch (FileNotFoundException e) {
                JOptionPane.showMessageDialog(padre, "Archivo no encontrado", "Carga Archivo", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            //desconectarDeServidor();
            } catch (SocketTimeoutException ste) {
                JOptionPane.showMessageDialog(null, "Se murio");
            }

        } catch (Exception ex) {
            System.err.println("ERROR Peer Caído!! guardando estado" + "\n" + ex.getMessage());
        }
        
    }
}
